<!DOCTYPE html>
<html lang="zh-cn">
  <head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta name="author" content="Zhou Wei <zromyk@163.com>">
  <title>机器学习精讲</title>
  <link rel="shortcut icon" href="/favicon.ico">
  <link rel="stylesheet" href="/style/html/pure.css">
  <link rel="stylesheet" href="/style/html/main.css">
  <link rel="stylesheet" href="https://cdn.staticfile.org/font-awesome/4.7.0/css/font-awesome.css">
  <!-- <link rel="stylesheet" href="https://apps.bdimg.com/libs/highlight.js/9.1.0/styles/default.min.css"> -->
<link rel="stylesheet" href="/style/article/highlight/default.min.css">
<link rel="stylesheet" href="/style/article/pell-1.0.6/dist/pell.css">

</head>
<body>
  <div id="menu-background"></div>
  <div id="menu">
    <div class="pure-menu pure-menu-horizontal">
  <ul class="pure-menu-list block-middle">
    <li class="pure-menu-item">
  <a class="pure-menu-heading" href="/index.html">ZROMYK</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link" href="/index.html">主页</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link" href="/public/archive/index.html">归档</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link" href="/public/download/index.html">下载</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link" href="/public/feedback/index.html">反馈</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link" href="/public/about/index.html">关于我</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link" href="https://github.com/zromyk"><i class="fa fa-github" style="font-size:32px"></i></a>
</li>

  </ul>
</div>

  </div>
  <div id="layout">
    <div class="content">
      <div id="nav">
    <div id="navigation" class="navigation">
  <ul class="pure-menu-list">
    <li class="pure-menu-item">
  <a class="pure-menu-link nav1" onclick="animateByNav()" href="#_1">第一部分 基本工具及概念</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav2" onclick="animateByNav()" href="#2">第2章 数值优化基础</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav3" onclick="animateByNav()" href="#_2">微积分定义的优性</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav4" onclick="animateByNav()" href="#_3">泰勒级数逼近</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav3" onclick="animateByNav()" href="#_4">优性的一阶条件</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav3" onclick="animateByNav()" href="#_5">凸性的便利</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav2" onclick="animateByNav()" href="#_6">优化数值方法</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav3" onclick="animateByNav()" href="#_7">停止条件</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav3" onclick="animateByNav()" href="#_8">梯度下降</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav4" onclick="animateByNav()" href="#_9">牛顿法</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav2" onclick="animateByNav()" href="#3">第3章 回归</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav4" onclick="animateByNav()" href="#_10">线性回归基础</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav4" onclick="animateByNav()" href="#_11">符号和建模</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav4" onclick="animateByNav()" href="#_12">用于线性回归的小二乘代价函数</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav4" onclick="animateByNav()" href="#_13">小二乘代价函数的小化</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav4" onclick="animateByNav()" href="#_14">所学模型的效力</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav4" onclick="animateByNav()" href="#_15">预测新输入数据的值</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav3" onclick="animateByNav()" href="#_16">知识驱动的回归特征设计</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav4" onclick="animateByNav()" href="#l_2">非线性回归和 <script type="math/tex">l_2</script> 正则化</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav4" onclick="animateByNav()" href="#_17">逻辑回归</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav5" onclick="animateByNav()" href="#sigmoid"><span style="overflow-x: auto; max-width:100%; display:inline;"><code>Sigmoid</code></span> 激活函数</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav5" onclick="animateByNav()" href="#tanh"><span style="overflow-x: auto; max-width:100%; display:inline;"><code>Tanh</code></span> 激活函数</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav5" onclick="animateByNav()" href="#relu"><span style="overflow-x: auto; max-width:100%; display:inline;"><code>Relu</code></span> 激活函数</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav5" onclick="animateByNav()" href="#leaky-relu"><span style="overflow-x: auto; max-width:100%; display:inline;"><code>Leaky Relu</code></span> 激活函数</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav5" onclick="animateByNav()" href="#p-relurelu"><span style="overflow-x: auto; max-width:100%; display:inline;"><code>P-Relu</code></span>（参数化的<span style="overflow-x: auto; max-width:100%; display:inline;"><code>ReLU</code></span>）</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav5" onclick="animateByNav()" href="#gelu"><span style="overflow-x: auto; max-width:100%; display:inline;"><code>Gelu</code></span> 激活函数</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav5" onclick="animateByNav()" href="#swich"><span style="overflow-x: auto; max-width:100%; display:inline;"><code>Swich</code></span> 激活函数</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav5" onclick="animateByNav()" href="#elu"><span style="overflow-x: auto; max-width:100%; display:inline;"><code>ELU</code></span> 激活函数</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav5" onclick="animateByNav()" href="#selu"><span style="overflow-x: auto; max-width:100%; display:inline;"><code>Selu</code></span> 激活函数</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav4" onclick="animateByNav()" href="#l_3">非凸代价函数和 <script type="math/tex">l_2</script> 正则化</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav2" onclick="animateByNav()" href="#4">第4章 分类</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav3" onclick="animateByNav()" href="#_18">感知机代价函数</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav4" onclick="animateByNav()" href="#_19">基本感知机模型</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav4" onclick="animateByNav()" href="#_20">间隔感知机</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav4" onclick="animateByNav()" href="#_21">间隔感知机的可微近似</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav4" onclick="animateByNav()" href="#_22">所学分类器的精度</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav4" onclick="animateByNav()" href="#_23">预测新输入数据的标签</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav4" onclick="animateByNav()" href="#_24">哪个代价函数会产生好的结果</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav4" onclick="animateByNav()" href="#_25">感知机和计数代价的关联</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav3" onclick="animateByNav()" href="#textsoftmax_1">逻辑回归视角下的 <script type="math/tex">\text{softmax}</script> 代价</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav4" onclick="animateByNav()" href="#_26">阶梯函数和分类</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav4" onclick="animateByNav()" href="#_27">凸逻辑回归</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav3" onclick="animateByNav()" href="#_28">支持向量机视角下的间隔感知机</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav4" onclick="animateByNav()" href="#_29">寻找大间隔超平面</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav4" onclick="animateByNav()" href="#_30">硬间隔支持向量机问题</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav4" onclick="animateByNav()" href="#_31">软间隔支持向量机问题</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav4" onclick="animateByNav()" href="#_32">支持向量机和逻辑回归</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav3" onclick="animateByNav()" href="#_33">多分类</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav4" onclick="animateByNav()" href="#_34">一对多的多分类</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav4" onclick="animateByNav()" href="#softmax">多分类softmax分类</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav4" onclick="animateByNav()" href="#_35">所学多分类器的精度</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav4" onclick="animateByNav()" href="#_36">哪种多分类方法表现好</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav3" onclick="animateByNav()" href="#_37">面向分类的知识驱动特征设计</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav3" onclick="animateByNav()" href="#_38">面向真实数据类型的直方图特征</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav4" onclick="animateByNav()" href="#_39">文本数据的直方图特征</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav4" onclick="animateByNav()" href="#_40">图像数据的直方图特征</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav4" onclick="animateByNav()" href="#_41">音频数据的直方图特征</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav1" onclick="animateByNav()" href="#_42">第二部分 完全数据驱动的机器学习工具</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav2" onclick="animateByNav()" href="#5">第5章回归的自动特征设计</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav3" onclick="animateByNav()" href="#_43">理想回归场景中的自动特征设计</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav4" onclick="animateByNav()" href="#_44">向量逼近</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav4" onclick="animateByNav()" href="#_45">从向量到连续函数</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav4" onclick="animateByNav()" href="#_46">连续函数逼近</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav4" onclick="animateByNav()" href="#_47">连续函数逼近的常见基</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav4" onclick="animateByNav()" href="#_48">获取权重</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav4" onclick="animateByNav()" href="#_49">神经网络的图表示</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav3" onclick="animateByNav()" href="#_50">真实回归场景中的自动特征设计</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav4" onclick="animateByNav()" href="#_51">离散化的连续函数逼近</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav4" onclick="animateByNav()" href="#_52">真实回归场景</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav3" onclick="animateByNav()" href="#_53">回归交叉验证</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav4" onclick="animateByNav()" href="#_54">诊断过拟合与欠拟合问题</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav4" onclick="animateByNav()" href="#_55">留出交叉验证</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav4" onclick="animateByNav()" href="#_56">留出交叉验证的计算</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav4" onclick="animateByNav()" href="#k">k折交叉验证</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav3" onclick="animateByNav()" href="#_57">哪个基好</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav4" onclick="animateByNav()" href="#_58">理解数据背后的现象</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav4" onclick="animateByNav()" href="#_59">实践方面的考虑</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav4" onclick="animateByNav()" href="#_60">什么时候可任意选择基</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav4" onclick="animateByNav()" href="#_61">关于连续函数逼近的注释</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav2" onclick="animateByNav()" href="#6">第6章分类中的自动特征设计</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav3" onclick="animateByNav()" href="#_62">理想分类场景中的自动特征设计</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav4" onclick="animateByNav()" href="#_63">分段连续函数逼近</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav4" onclick="animateByNav()" href="#_64">指示函数的形式化定义</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav4" onclick="animateByNav()" href="#_65">指示函数逼近</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav4" onclick="animateByNav()" href="#_66">获取权重</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav3" onclick="animateByNav()" href="#_67">真实分类场景中的自动特征设计</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav4" onclick="animateByNav()" href="#_68">离散化的指示函数逼近</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav4" onclick="animateByNav()" href="#_69">真实的分类场景</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav4" onclick="animateByNav()" href="#_70">分类器精度和边界定义</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav3" onclick="animateByNav()" href="#_71">多分类</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav4" onclick="animateByNav()" href="#_72">一对多的多分类</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav4" onclick="animateByNav()" href="#softmax_1">多分类softmax分类</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav3" onclick="animateByNav()" href="#_73">分类交叉验证</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav4" onclick="animateByNav()" href="#_74">留出交叉验证</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav4" onclick="animateByNav()" href="#_75">留出交叉验证的计算</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav4" onclick="animateByNav()" href="#k_1">k折交叉验证</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav4" onclick="animateByNav()" href="#k_2">一对多多分类的k折交叉验证</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav3" onclick="animateByNav()" href="#_76">哪个基好</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav2" onclick="animateByNav()" href="#7">第7章核、反向传播和正则化交叉验证</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav3" onclick="animateByNav()" href="#_77">固定特征核</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav4" onclick="animateByNav()" href="#_78">线性代数基本定理</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav4" onclick="animateByNav()" href="#_79">核化代价函数</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav4" onclick="animateByNav()" href="#_80">核化的价值</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav4" onclick="animateByNav()" href="#_81">核的例子</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav4" onclick="animateByNav()" href="#_82">核作为相似矩阵</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav3" onclick="animateByNav()" href="#_83">反向传播算法</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav4" onclick="animateByNav()" href="#_84">计算两层网络代价函数的梯度</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav4" onclick="animateByNav()" href="#_85">计算三层神经网络的梯度</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav4" onclick="animateByNav()" href="#_86">动量梯度下降</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav3" onclick="animateByNav()" href="#l2">l2正则化交叉验证</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav4" onclick="animateByNav()" href="#l2_1">l2正则化和交叉验证</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav4" onclick="animateByNav()" href="#k_3">回归的k折正则化交叉验证</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav4" onclick="animateByNav()" href="#_87">分类的正则化交叉验证</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav3" onclick="animateByNav()" href="#_88">更多的核计算</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav4" onclick="animateByNav()" href="#_89">核化不同的代价函数</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav4" onclick="animateByNav()" href="#_90">傅里叶核——标量输入</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav4" onclick="animateByNav()" href="#_91">傅里叶核——向量输入</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav1" onclick="animateByNav()" href="#_92">第三部分大规模数据机器学习方法</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav2" onclick="animateByNav()" href="#8">第8章高级梯度算法</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav3" onclick="animateByNav()" href="#_93">梯度下降法的固定步长规则</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav4" onclick="animateByNav()" href="#_94">梯度下降法和简单的二次代理</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav4" onclick="animateByNav()" href="#_95">有界曲率函数和优保守步长规则</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav4" onclick="animateByNav()" href="#_96">如何使用保守固定步长规则</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav3" onclick="animateByNav()" href="#_97">梯度下降的自适应步长规则</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav4" onclick="animateByNav()" href="#_98">回溯线性搜索的自适应步长规则</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav4" onclick="animateByNav()" href="#_99">如何使用自适应步长规则</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav3" onclick="animateByNav()" href="#_100">随机梯度下降</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav4" onclick="animateByNav()" href="#_101">梯度分解</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav4" onclick="animateByNav()" href="#_102">随机梯度下降迭代</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav4" onclick="animateByNav()" href="#_103">随机梯度下降的价值</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav4" onclick="animateByNav()" href="#_104">随机梯度下降的步长规则</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav4" onclick="animateByNav()" href="#_105">在实践中如何使用随机梯度下降法</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav3" onclick="animateByNav()" href="#_106">梯度下降方案的收敛性证明</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav4" onclick="animateByNav()" href="#_107">利普希茨常数固定步长梯度下降的收敛性</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav4" onclick="animateByNav()" href="#_108">回溯线性搜索梯度下降的收敛性</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav4" onclick="animateByNav()" href="#_109">随机梯度法的收敛性</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav4" onclick="animateByNav()" href="#_110">面向凸函数的固定步长梯度下降的收敛速度</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav3" onclick="animateByNav()" href="#_111">计算利普希茨常数</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav2" onclick="animateByNav()" href="#9">第9章降维技术</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav3" onclick="animateByNav()" href="#_112">数据的降维技术</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav4" onclick="animateByNav()" href="#_113">随机子采样</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav4" onclick="animateByNav()" href="#k_4">K均值聚类</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav4" onclick="animateByNav()" href="#k_5">K均值问题的优化</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav3" onclick="animateByNav()" href="#_114">主成分分析</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav3" onclick="animateByNav()" href="#_115">推荐系统</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav4" onclick="animateByNav()" href="#_116">矩阵填充模型</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav4" onclick="animateByNav()" href="#_117">矩阵填充模型的优化</a>
</li>

  </ul>
</div>

</div>
<div id="content-articles">
  <h1 id="机器学习精讲" class="content-subhead">机器学习精讲</h1>
  <p>
    <span>2021-01-14</span>
    <span><span class="post-category post-category-machine-learning">Machine Learning</span></span>
    <button id="button-markdownEditor" class="pure-button" onclick="markdownEditor()">启用编辑</button>
    <button id="button-save" class="pure-button" onclick="save()">保存</button>
  </p>
  <div id="content-articles-markdownEditor" style="display: none;">
    <h1>编辑 power by pell</h1>
    <div id="editor" class="pell"></div>
    <div style="margin-top:20px;">
        <h3>Text output:</h3>
        <div id="text-output"></div>
    </div>
    <div style="margin-top:20px;">
        <h3>HTML output:</h3>
        <pre id="html-output"></pre>
    </div>
  </div>
  <div id="content-articles-markdown">
    <blockquote class="content-quote">
<p>机器学习精讲：基础、算法及应用 [Machine Learning Refined Foundations，Algorithms，and Applications] 读书笔记</p>
</blockquote>
<p>本书课后练习资料下载地址：<a href="https://github.com/jermwatt/machine_learning_refined">https://github.com/jermwatt/machine<em>learning</em>refined</a></p>
<pre><code class="pre-wrap"><span style="overflow-x: auto; max-width:100%; display:inline;"><code>├── mlrefined_datasets
│   ├── nonlinear_superlearn_datasets   非线性超学习数据集
│   ├── superlearn_datasets             超学习数据集
│   └── unsuperlearn_datasets           非超学习数据集
├── mlrefined_exercises
│   ├── ed_1
│   │   ├── MATLAB
│   │   ├── Python2
│   │   └── Python3
│   └── ed_2
├── mlrefined_images
├── mlrefined_libraries
│   ├── calculus_library                微积分库
│   ├── linear_algebra_library          线性代数库
│   ├── math_optimization_library       数学优化库
│   ├── multilayer_perceptron_library   多层感知器库
│   ├── nonlinear_superlearn_library    非线性超学习库
│   ├── superlearn_library              超学习库
│   └── unsupervised_library            无人监督的库
├── notes
│   ├── 2_Zero_order_methods
│   ├── 3_First_order_methods
│   ├── 4_Second_order_methods
│   ├── 5_Linear_regression
│   ├── 6_Linear_twoclass_classification
│   ├── 7_Linear_multiclass_classification
│   ├── 8_Linear_unsupervised_learning
│   ├── 9_Feature_engineer_select
│   ├── 10_Nonlinear_intro
│   ├── 11_Feature_learning
│   ├── 13_Multilayer_perceptrons
│   └── 16_Linear_algebra
└── sample_chapters
</code></span></code></pre>
<h1 id="_1">第一部分 基本工具及概念</h1>
<h2 id="2">第2章 数值优化基础</h2>
<h3 id="_2">微积分定义的优性</h3>
<h4 id="_3">泰勒级数逼近</h4>
<p>泰勒公式：<br />
<script type="math/tex; mode=display">
f(x) = f(x_0) + f'(x_0)(x-x_0) + \cdots + \cfrac{1}{n!}f^{(n)}(x_0)(x-x_0)^n + \cfrac{1}{(n+1)!}f^{(n)}(\xi)(x-x_0)^{n+1}\cdots
</script>
<br />
一次输入的泰勒级数逼近：<br />
<script type="math/tex; mode=display">
\begin{equation}\begin{split} 
一次逼近: h(w) &= g(v) + g'(v)(w-v)\\
二次逼近: h(w) &= g(v) + g'(v)(w-v) + \cfrac{1}{2}g''(v)(w-v)^2
\end{split}\end{equation}
</script>
<br />
对于向量值 <script type="math/tex; mode=display">\pmb{w} = [w_1,w_2,w_3,\cdots,w_N]^T</script> 输入的多次可微分函数 <script type="math/tex">g(\pmb{w})</script> 的泰勒级数逼近：<br />
<script type="math/tex; mode=display">
\begin{equation}\begin{split} 
一次逼近: h(\pmb{w})&=g(\pmb{v})+\nabla g(\pmb{v})^T(\pmb{w}-\pmb{v}) \\
二次逼近: h(\pmb{w})&=g(\pmb{v})+\nabla g(\pmb{v})^T(\pmb{w}-\pmb{v})+\cfrac{1}{2}(\pmb{w}-\pmb{v})^T\nabla^2 g(\pmb{v})(\pmb{w}-\pmb{v})
\end{split}\end{equation}
</script>
<br />
海森矩阵：<br />
<script type="math/tex; mode=display">
\nabla g(\pmb{v}) =
\left[\begin{array}{c c c}
\cfrac{\partial^2}{\partial w_1\partial w_1}g(\pmb{v}) & \cfrac{\partial^2}{\partial w_1\partial w_2}g(\pmb{v}) & \cdots & \cfrac{\partial^2}{\partial w_1\partial w_N}g(\pmb{v}) \\
\cfrac{\partial^2}{\partial w_2\partial w_1}g(\pmb{v}) & \cfrac{\partial^2}{\partial w_2\partial w_2}g(\pmb{v}) & \cdots & \cfrac{\partial^2}{\partial w_2\partial w_N}g(\pmb{v}) \\
\vdots&\vdots&\ddots&\vdots\\
\cfrac{\partial^2}{\partial w_N\partial w_1}g(\pmb{v}) & \cfrac{\partial^2}{\partial w_N\partial w_2}g(\pmb{v}) & \cdots & \cfrac{\partial^2}{\partial w_N\partial w_N}g(\pmb{v})
\end{array}\right]
</script>
</p>
<h3 id="_4">优性的一阶条件</h3>
<h3 id="_5">凸性的便利</h3>
<h2 id="_6">优化数值方法</h2>
<h3 id="_7">停止条件</h3>
<h3 id="_8">梯度下降</h3>
<p>根据一次泰勒逼近<br />
<script type="math/tex; mode=display">
h(\pmb{w})=g(\pmb{w}^0)+\nabla g(\pmb{w}^0)(\pmb{w}-\pmb{w}^0)
</script>
<br />
不断沿着负梯度的方向前进<br />
<script type="math/tex; mode=display">
\pmb{w}^1=\pmb{w}^0-a_1\nabla g(\pmb{w}^0) \\
\pmb{w}^2=\pmb{w}^1-a_2\nabla g(\pmb{w}^1) \\
\vdots \\
\pmb{w}^k=\pmb{w}^{k-1}-a_k\nabla g(\pmb{w}^{k-1}) \\
</script>
<br />
最终到达 <script type="math/tex">g</script> 的一个 <strong>驻点</strong> （梯度等于0的点）</p>
<h4 id="_9">牛顿法</h4>
<p>根据二次泰勒逼近<br />
<script type="math/tex; mode=display">
h(\pmb{w})=g(\pmb{w}^0)+\nabla g(\pmb{w}^0)^T(\pmb{w}-\pmb{w}^0)+\cfrac{1}{2}(\pmb{w}-\pmb{w}^0)^T\nabla^2 g(\pmb{v}^0)(\pmb{w}-\pmb{w}^0)
</script>
</p>
<p>
<script type="math/tex; mode=display">
\nabla^2 g(\pmb{w}^0)\pmb{w}^1=\nabla^2 g(\pmb{w}^0)\pmb{w}^0-\nabla g(\pmb{w}^0) \\
\nabla^2 g(\pmb{w}^1)\pmb{w}^2=\nabla^2 g(\pmb{w}^1)\pmb{w}^1-\nabla g(\pmb{w}^1) \\
\vdots \\
\nabla^2 g(\pmb{w}^{k-1})\pmb{w}^k=\nabla^2 g(\pmb{w}^{k-1})\pmb{w}^{k-1}-\nabla g(\pmb{w}^{k-1}) \\
</script>
</p>
<p>如果 <script type="math/tex">\nabla^2 g(\pmb{w}^{k-1})</script> 是可逆的，那么<br />
<script type="math/tex; mode=display">
\pmb{w}^k=\pmb{w}^{k-1}-\cfrac{1}{\nabla^2 g(\pmb{w}^{k-1})}\nabla g(\pmb{w}^{k-1})
</script>
</p>
<blockquote class="content-quote">
<p>牛顿法用于最小化具有2维输入的凸二次函数函数，从任意点开始，都只需要一步即可达到最小值。</p>
</blockquote>
<h2 id="3">第3章 回归</h2>
<h4 id="_10">线性回归基础</h4>
<p>回归问题的训练集由 <script type="math/tex">P</script> 对输入/输出对构成：</p>
<p>
<script type="math/tex; mode=display">
\{(\pmb{x}_1,y_1),(\pmb{x}_2,y_2),(\pmb{x}_3,y_3),\cdots,(\pmb{x}_p,y_p),\cdots,(\pmb{x}_P,y_P)\} \tag{3-1}
</script>
</p>
<p>每个输入 <script type="math/tex">\pmb{x}_p</script> 都可能会是一个长度为 <script type="math/tex">N</script> 维的列向量：<br />
<script type="math/tex; mode=display">
\pmb{x}_p
=
\left[\begin{matrix}
x_{1,p}\\
x_{2,p}\\
x_{3,p}\\
\vdots\\
x_{N,p}\\
\end{matrix}\right]
</script>
<br />
通过一个常量 <script type="math/tex">b</script> （1个偏置）和一个列向量 <script type="math/tex">w</script>（含 <script type="math/tex">N</script> 个权重）<br />
<script type="math/tex; mode=display">
\pmb{w} = \left[\begin{matrix}
w_1\\
w_2\\
w_3\\
\vdots\\
w_N\\
\end{matrix}\right]
</script>
<br />
确定 <script type="math/tex">N</script> 维度输入 和 输出数据之间近似的线性关系：<br />
<script type="math/tex; mode=display">
b + \pmb{x}^T_p \pmb{w} \approx y_p ,\quad p=1,\cdots,P \tag{3-2}
</script>
</p>
<p>当 <script type="math/tex">N\ge1</script> 时，通过调节一个偏置 <script type="math/tex">b</script> 和 <script type="math/tex">N</script> 个权重 <script type="math/tex">\pmb{w}</script> 确定一个 <script type="math/tex">N</script> 维的超平面，拟合 <script type="math/tex">N+1</script> 维空间中的离散数据点：</p>
<p>
<script type="math/tex; mode=display">
b
+
\left[\begin{matrix}
x_{1,p}\\
x_{2,p}\\
x_{3,p}\\
\vdots\\
x_{N,p}\\
\end{matrix}\right]^T
\left[\begin{matrix}
w_1\\
w_2\\
w_3\\
\vdots\\
w_N\\
\end{matrix}\right]
\approx
y_p
\tag{3-3}
</script>
</p>
<p>对所有输入的 <script type="math/tex">P</script> 个输入向量(特征) <script type="math/tex">\pmb{x}_p</script> 和对应的 <script type="math/tex">P</script> 个输出(标签) <script type="math/tex">y_p</script> 的总关系为：</p>
<p>
<script type="math/tex; mode=display">
\left[\begin{matrix}
b\\
b\\
b\\
b\\
\vdots\\
b\\
\end{matrix}\right]
+
\left[\begin{matrix}
x_{1,1}&x_{1,2}&x_{1,3}&x_{1,4}&\cdots&x_{1,p}\\
x_{2,1}&x_{2,2}&x_{2,3}&x_{2,4}&\cdots&x_{2,p}\\
x_{3,1}&x_{3,2}&x_{3,3}&x_{3,4}&\cdots&x_{3,p}\\
\vdots&\vdots&\vdots&\vdots&\ddots&\vdots\\
x_{N,1}&x_{N,2}&x_{N,3}&x_{N,4}&\cdots&x_{N,p}\\
\end{matrix}\right]^T
\left[\begin{matrix}
w_1\\
w_2\\
w_3\\
\vdots\\
w_N\\
\end{matrix}\right]
\approx
\left[\begin{matrix}
y_1\\
y_2\\
y_3\\
y_4\\
\vdots\\
y_P\\
\end{matrix}\right]
\tag{3-4}
</script>
</p>
<p>即：<br />
<script type="math/tex; mode=display">
\left[\begin{matrix}
b\\
b\\
b\\
b\\
\vdots\\
b\\
\end{matrix}\right]
+
\left[\begin{matrix}
x_{1,1}&x_{2,1}&x_{3,1}&\cdots&x_{N,1}\\
x_{1,2}&x_{2,2}&x_{3,2}&\cdots&x_{N,2}\\
x_{1,3}&x_{2,3}&x_{3,3}&\cdots&x_{N,3}\\
x_{1,4}&x_{2,4}&x_{3,4}&\cdots&x_{N,4}\\
\vdots&\vdots&\vdots&\ddots&\vdots\\
x_{1,p}&x_{2,p}&x_{3,p}&\cdots&x_{N,p}\\
\end{matrix}\right]
\left[\begin{matrix}
w_1\\
w_2\\
w_3\\
\vdots\\
w_N\\
\end{matrix}\right]
\approx
\left[\begin{matrix}
y_1\\
y_2\\
y_3\\
y_4\\
\vdots\\
y_P\\
\end{matrix}\right]
\tag{3-5}
</script>
</p>
<h4 id="_11">符号和建模</h4>
<h4 id="_12">用于线性回归的小二乘代价函数</h4>
<h4 id="_13">小二乘代价函数的小化</h4>
<h4 id="_14">所学模型的效力</h4>
<h4 id="_15">预测新输入数据的值</h4>
<h3 id="_16">知识驱动的回归特征设计</h3>
<h4 id="l_2">非线性回归和 <script type="math/tex">l_2</script> 正则化</h4>
<h4 id="_17">逻辑回归</h4>
<h5 id="sigmoid"><span style="overflow-x: auto; max-width:100%; display:inline;"><code>Sigmoid</code></span> 激活函数</h5>
<p>经典逻辑回归问题的核心是所谓的逻辑 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>sigmoid</code></span> 函数（即激活函数）：<br />
<script type="math/tex; mode=display">
\sigma(x) = \cfrac{1}{1+e^{-x}}
</script>
</p>
<div class="pure-table-scrollable"><table class="pure-table pure-table-horizontal">
<tr>
  <td><img class="pure-img" src="https://zromyk.gitee.io/myblog-figurebed/post/机器学习精讲.assets/sigmoid.svg" alt="sigmoid"/></td>
  <td><img class="pure-img" src="https://zromyk.gitee.io/myblog-figurebed/post/机器学习精讲.assets/sigmoid_.svg" alt="sigmoid_"/></td>
</tr>
</table></div>
<p><span style="overflow-x: auto; max-width:100%; display:inline;"><code>Sigmoid</code></span> 函数也叫 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>Logistic</code></span> 函数，用于隐藏层的输出，输出在(0,1)之间，它可以将一个实数映射到(0,1)的范围内，可以用来做二分类。</p>
<p>常用于：在特征相差比较复杂或是相差不是特别大的时候效果比较好。</p>
<p>该函数将大的负数转换成0，将大的正数转换为1。</p>
<p>sigmoid函数的缺点:</p>
<ul>
<li>梯度消失：Sigmoid 函数趋近 0 和 1 的时候变化率会变得平坦，也就是说，Sigmoid 的梯度趋近于 0。神经网络使用 Sigmoid 激活函数进行反向传播时，输出接近 0 或 1 的神经元其梯度趋近于 0。这些神经元叫作饱和神经元。因此，这些神经元的权重不会更新。此外，与此类神经元相连的神经元的权重也更新得很慢。该问题叫作梯度消失。因此，想象一下，如果一个大型神经网络包含 Sigmoid 神经元，而其中很多个都处于饱和状态，那么该网络无法执行反向传播。</li>
<li>不以零为中心：Sigmoid 输出不以零为中心的。</li>
<li>计算成本高昂：exp() 函数与其他非线性激活函数相比，计算成本高昂。</li>
</ul>
<p>下一个要讨论的非线性激活函数解决了 Sigmoid 函数中值域期望不为 0 的问题。</p>
<h5 id="tanh"><span style="overflow-x: auto; max-width:100%; display:inline;"><code>Tanh</code></span> 激活函数</h5>
<p>
<script type="math/tex; mode=display">
\tanh(x) = \cfrac{e^x-e^{-x}}{e^x+e^{-x}}
</script>
</p>
<div class="pure-table-scrollable"><table class="pure-table pure-table-horizontal">
<tr>
  <td><img class="pure-img" src="https://zromyk.gitee.io/myblog-figurebed/post/机器学习精讲.assets/tanh.svg" alt="sigmoid"/></td>
  <td><img class="pure-img" src="https://zromyk.gitee.io/myblog-figurebed/post/机器学习精讲.assets/tanh_.svg" alt="sigmoid_"/></td>
</tr>
</table></div>

<p>Tanh 激活函数又叫作双曲正切激活函数（hyperbolic tangent activation function）。</p>
<p>与 Sigmoid 函数类似，Tanh 函数也使用真值，但 Tanh 函数将其压缩至-1 到 1 的区间内。与 Sigmoid 不同，Tanh 函数的输出以零为中心，因为区间在-1 到 1 之间。你可以将 Tanh 函数想象成两个 Sigmoid 函数放在一起。在实践中，Tanh 函数的使用优先性高于 Sigmoid 函数。负数输入被当作负值，零输入值的映射接近零，正数输入被当作正值。</p>
<p><strong>优点：它解决了Sigmoid函数的不是zero-centered输出问题。</strong></p>
<p><strong>缺点：梯度消失（gradient vanishing）的问题和幂运算的问题仍然存在。</strong></p>
<p>为了解决梯度消失问题，我们来讨论另一个非线性激活函数——修正线性单元（rectified linear unit，ReLU），该函数明显优于前面两个函数，是现在使用最广泛的函数。</p>
<h5 id="relu"><span style="overflow-x: auto; max-width:100%; display:inline;"><code>Relu</code></span> 激活函数</h5>
<p>
<script type="math/tex; mode=display">
Relu = max(0,x)
</script>
</p>
<div class="pure-table-scrollable"><table class="pure-table pure-table-horizontal">
<tr>
  <td><img class="pure-img" src="https://zromyk.gitee.io/myblog-figurebed/post/机器学习精讲.assets/Relu.svg" alt="sigmoid"/></td>
  <td><img class="pure-img" src="https://zromyk.gitee.io/myblog-figurebed/post/机器学习精讲.assets/Relu_.svg" alt="sigmoid_"/></td>
</tr>
</table></div>

<p>Relu激活函数优点：</p>
<p>当输入 x&lt;0 时，输出为 0，当 x&gt; 0 时，输出为 x。该激活函数使网络更快速地收敛。它不会饱和，即它可以对抗梯度消失问题，至少在正区域（x&gt; 0 时）可以这样，因此神经元至少在一半区域中不会把所有零进行反向传播。由于使用了简单的阈值化（thresholding），ReLU 计算效率很高。</p>
<p>Relu激活函数缺点：</p>
<ul>
<li>不以零为中心：和 Sigmoid 激活函数类似，ReLU 函数的输出不以零为中心。</li>
<li>前向传导（forward pass）过程中，如果 x &lt; 0，则神经元保持非激活状态，且在后向传导（backward pass）中「杀死」梯度。这样权重无法得到更新，网络无法学习。当 x = 0 时，该点的梯度未定义，但是这个问题在实现中得到了解决，通过采用左侧或右侧的梯度的方式。</li>
</ul>
<p>尽管存在这两个问题，<strong>ReLU目前仍是最常用的activation function，在搭建人工神经网络的时候推荐优先尝试！</strong></p>
<p>为了解决 ReLU 激活函数中的梯度消失问题，当 x &lt; 0 时，我们使用 Leaky ReLU——该函数试图修复 dead ReLU 问题。下面我们就来详细了解 Leaky ReLU。</p>
<h5 id="leaky-relu"><span style="overflow-x: auto; max-width:100%; display:inline;"><code>Leaky Relu</code></span> 激活函数</h5>
<p>
<script type="math/tex; mode=display">
\text{Leaky Relu} = \max(x\alpha,x),\quad a\in(0,1)
</script>
</p>
<div class="pure-table-scrollable"><table class="pure-table pure-table-horizontal">
<tr>
  <td><img class="pure-img" src="https://zromyk.gitee.io/myblog-figurebed/post/机器学习精讲.assets/LeakyRelu.svg" alt="sigmoid"/></td>
  <td><img class="pure-img" src="https://zromyk.gitee.io/myblog-figurebed/post/机器学习精讲.assets/LeakyRelu_.svg" alt="sigmoid_"/></td>
</tr>
</table></div>

<p>Leaky ReLU 的概念是：当 x &lt; 0 时，它得到 0.01 的正梯度。</p>
<p>优点：该函数一定程度上缓解了 dead ReLU 问题。</p>
<p>缺点：使用该函数的结果并不连贯。尽管它具备 ReLU 激活函数的所有特征，如计算高效、快速收敛、在正区域内不会饱和。</p>
<p>Leaky ReLU 可以得到更多扩展。不让 x 乘常数项，而是让 x 乘超参数，这看起来比 Leaky ReLU 效果要好。该扩展就是 Parametric ReLU。</p>
<h5 id="p-relurelu"><span style="overflow-x: auto; max-width:100%; display:inline;"><code>P-Relu</code></span>（参数化的<span style="overflow-x: auto; max-width:100%; display:inline;"><code>ReLU</code></span>）</h5>
<p>其中是超参数。这里引入了一个随机的超参数 <script type="math/tex">\alpha</script>，它可以被学习，因为你可以对它进行反向传播。这使神经元能够选择负区域最好的梯度，有了这种能力，它们可以变成 ReLU 或 Leaky ReLU。</p>
<p>总之，最好使用 ReLU，但是你可以使用 Leaky ReLU 或 Parametric ReLU 实验一下，看看它们是否更适合你的问题。</p>
<h5 id="r-relureluain-ulu-l-lt-u-l-and-uin01"><span style="overflow-x: auto; max-width:100%; display:inline;"><code>R-Relu</code></span>（随机<span style="overflow-x: auto; max-width:100%; display:inline;"><code>ReLU</code></span>），<script type="math/tex">a\in U(l,u),\ l \lt u,\ l\ and\ u\in[0,1)</script>
</h5>
<h5 id="gelu"><span style="overflow-x: auto; max-width:100%; display:inline;"><code>Gelu</code></span> 激活函数</h5>
<p>
<script type="math/tex; mode=display">
\sigma(x) = \cfrac{x}{1+e^{-1.702x}}
</script>
</p>
<div class="pure-table-scrollable"><table class="pure-table pure-table-horizontal">
<tr>
  <td><img class="pure-img" src="https://zromyk.gitee.io/myblog-figurebed/post/机器学习精讲.assets/Gelu.svg" alt="sigmoid"/></td>
  <td><img class="pure-img" src="https://zromyk.gitee.io/myblog-figurebed/post/机器学习精讲.assets/Gelu_.svg" alt="sigmoid_"/></td>
</tr>
</table></div>

<p>bert中使用的激活函数，作者经过实验证明比relu等要好。原点可导，不会有Dead ReLU问题。</p>
<h5 id="swich"><span style="overflow-x: auto; max-width:100%; display:inline;"><code>Swich</code></span> 激活函数</h5>
<p>
<script type="math/tex; mode=display">
\sigma(x) = \cfrac{x}{1+e^{-\beta x}}
</script>
</p>
<div class="pure-table-scrollable"><table class="pure-table pure-table-horizontal">
<tr>
  <td><img class="pure-img" src="https://zromyk.gitee.io/myblog-figurebed/post/机器学习精讲.assets/Swich.svg" alt="sigmoid"/></td>
  <td><img class="pure-img" src="https://zromyk.gitee.io/myblog-figurebed/post/机器学习精讲.assets/Swich_.svg" alt="sigmoid_"/></td>
</tr>
</table></div>

<p>根据上图，从图像上来看，Swish函数跟ReLu差不多，唯一区别较大的是接近于0的负半轴区域，因此，Swish 激活函数的输出可能下降，即使在输入值增大的情况下。大多数激活函数是单调的，即输入值增大的情况下，输出值不可能下降。而 Swish 函数为 0 时具备单侧有界（one-sided boundedness）的特性，它是平滑、非单调的。</p>
<p>缺点： 只有实验证明，没有理论支持。 在浅层网络上，性能与relu差别不大。</p>
<h5 id="elu"><span style="overflow-x: auto; max-width:100%; display:inline;"><code>ELU</code></span> 激活函数</h5>
<p>
<script type="math/tex; mode=display">
Elu=\begin{cases}x,&x>0\\a(e^x-1) &\text{otherwise}\end{cases}
</script>
</p>
<div class="pure-table-scrollable"><table class="pure-table pure-table-horizontal">
<tr>
  <td><img class="pure-img" src="https://zromyk.gitee.io/myblog-figurebed/post/机器学习精讲.assets/ELU.svg" alt="sigmoid"/></td>
  <td><img class="pure-img" src="https://zromyk.gitee.io/myblog-figurebed/post/机器学习精讲.assets/ELU_.svg" alt="sigmoid_"/></td>
</tr>
</table></div>

<p>ELU也是为解决ReLU存在的问题而提出。</p>
<p>Elu激活函数有优点：ReLU的基本所有优点、不会有Dead ReLU问题，输出的均值接近0、零中心点问题。</p>
<p>Elu激活函数有缺点：计算量稍大，原点不可导。</p>
<p>类似于Leaky ReLU，理论上虽然好于ReLU，但在实际使用中目前并没有好的证据ELU总是优于ReLU。</p>
<h5 id="selu"><span style="overflow-x: auto; max-width:100%; display:inline;"><code>Selu</code></span> 激活函数</h5>
<p>
<script type="math/tex; mode=display">
Selu=\lambda\begin{cases}x,&x>0\\a(e^x-1) &\text{otherwise}\end{cases}
</script>
</p>
<div class="pure-table-scrollable"><table class="pure-table pure-table-horizontal">
<tr>
  <td><img class="pure-img" src="https://zromyk.gitee.io/myblog-figurebed/post/机器学习精讲.assets/Selu.svg" alt="sigmoid"/></td>
  <td><img class="pure-img" src="https://zromyk.gitee.io/myblog-figurebed/post/机器学习精讲.assets/Selu_.svg" alt="sigmoid_"/></td>
</tr>
</table></div>

<p>其实就是ELU乘了个lambda，关键在于这个lambda是大于1的。以前relu，prelu，elu这些激活函数，都是在负半轴坡度平缓，这样在activation的方差过大的时候可以让它减小，防止了梯度爆炸，但是正半轴坡度简单的设成了1。而selu的正半轴大于1，在方差过小的的时候可以让它增大，同时防止了梯度消失。这样激活函数就有一个不动点，网络深了以后每一层的输出都是均值为0方差为1。</p>
<p>当其中参数取为 <script type="math/tex">\lambda=1.0507,\alpha=1.6733</script> 时，在网络权重服从标准正态分布的条件下，各层输出的分布会向标准正态分布靠拢。这种「自我标准化」的特性可以避免梯度消失和爆炸的问题，让结构简单的前馈神经网络获得甚至超越 state-of-the-art 的性能。</p>
<p>selu的证明部分前提是权重服从正态分布，但是这个假设在实际中并不能一定成立，众多实验发现效果并不比relu好。</p>
<h4 id="l_3">非凸代价函数和 <script type="math/tex">l_2</script> 正则化</h4>
<p>对于包含 <script type="math/tex">P</script> 对数据集 <script type="math/tex">\{(\pmb{x}_p,y_p)\}_{p=1}^P</script> ，其中 <script type="math/tex">\pmb{x}_p</script> 是 <script type="math/tex">N</script> 维数据，如果其分布大致为一个逻辑 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>sigmoid</code></span> 函数，那么数据将满足以下公式：<br />
<script type="math/tex; mode=display">
\sigma(b+\pmb{x}_p^T \pmb{w}) \approx y_p,\quad p=1,\cdots,P \tag{3-31}
</script>
<br />
注意该公式和公式 <script type="math/tex">\eqref{3-2}</script> 中的线性回归方程组不同，公式 <script type="math/tex">\text{(3-31)}</script> 关于 <script type="math/tex">b</script> 和 <script type="math/tex">\pmb{w}</script> 是非线形的，这些非线性将导致最小二乘代价函数是非凸的，该函数由公式 <script type="math/tex">\text{(3-31)}</script> 的平方误差在 <script type="math/tex">p</script> 个数据点上累计求和得到：<br />
<script type="math/tex; mode=display">
g(b,\pmb{w})=\sum_{p=1}^P(\sigma(b+\pmb{x}_p^T\pmb{w})-y_p)^2 \tag{3-32}
</script>
<br />
由于 <script type="math/tex">\sigma(t)</script> 的导数为 <script type="math/tex">\sigma(t)'=\sigma(t)(1-\sigma(t))</script> ，因此，代价函数的梯度可以表示为：<br />
<script type="math/tex; mode=display">
\nabla g(b,\pmb{w})=2\sum_{p=1}^P(\sigma(b+\pmb{x}_p^T\pmb{w})-y_p)\sigma(b+\pmb{x}_p^T\pmb{w})(1-\sigma(b+\pmb{x}_p^T\pmb{w}))\pmb{x}_p \tag{3-32}
</script>
</p>
<p>
<script type="math/tex; mode=display">
\nabla g(b,\pmb{w})=2\sum_{p=1}^P(\sigma(...)-y_p)\sigma(...)(1-\sigma(...))\pmb{x}_p
</script>
</p>
<p>以上方程组包含很多非线形成分，因此直接求解一阶方程系统并不能达到期望的结果。因此我们必须使用数值技术（如梯度下降法或牛顿法）来求解相关代价函数的最小值。</p>
<p>实践中最常用的正则项是权重的平方 <script type="math/tex">l_2</script> 范数<br />
<script type="math/tex; mode=display">
||w||_2^2 = \sum_{n=1}^N w_n^2 \tag{3-33}
</script>
</p>
<p>称为 <script type="math/tex">l_2</script> 正则项</p>
<p>带 <script type="math/tex">l_2</script> 正则项的代价函数：<br />
<script type="math/tex; mode=display">
g(b,\pmb{w})+\lambda||w||_2^2,\quad\lambda\ge0 \tag{3-34}
</script>
</p>
<h2 id="4">第4章 分类</h2>
<h3 id="_18">感知机代价函数</h3>
<h4 id="_19">基本感知机模型</h4>
<p>分类问题的训练集于回归问题相同，由 <script type="math/tex">P</script> 对输入/输出对构成：</p>
<p>
<script type="math/tex; mode=display">
\{(\pmb{x}_1,y_1),(\pmb{x}_2,y_2),(\pmb{x}_3,y_3),\cdots,(\pmb{x}_p,y_p),\cdots,(\pmb{x}_P,y_P)\} \tag{4-1}
</script>
</p>
<p>理论上标签 <script type="math/tex">y_p</script> 可以任选两个值，但假设标签对于 <script type="math/tex">p=1,2,\cdots,P</script> 有 <script type="math/tex">y_p \in \{-1,+1\}</script> ，对于分类问题特别有效。</p>
<p>通过调节一个偏置 <script type="math/tex">b</script> 和 <script type="math/tex">N</script> 个权重 <script type="math/tex">\pmb{w}</script> 确定一个 <script type="math/tex">N</script> 维的超平面，在 <script type="math/tex">N+1</script> 维空间中分割离散数据点：<br />
<script type="math/tex; mode=display">
b+\pmb{x}_p^T\pmb{w}>0 \quad y_p = +1 \tag{4-2} \\
b+\pmb{x}_p^T\pmb{w}<0 \quad y_p = -1
</script>
<br />
由于标签为 <script type="math/tex">\pm1</script>， 将两个表达式乘以他们各自的标签的相反数 <script type="math/tex">-y_p</script> 来简洁表达一个等价的表达式：<br />
<script type="math/tex; mode=display">
-y_p(b+\pmb{x}_p^T\pmb{w})<0 \tag{4-3}
</script>
<br />
通过取这这个值与零值之间的最大者，我们可以写出超平面对于点 <script type="math/tex">\pmb{x}_p</script> 进行正确分类的条件，等价于：<br />
<script type="math/tex; mode=display">
\max(0, -y_p(b+\pmb{x}_p^T\pmb{w}))=0 \tag{4-4}
</script>
<br />
如果 <script type="math/tex">\pmb{x}_p</script> 被正确分类，则表达式 <script type="math/tex">\max(0, -y_p(b+\pmb{x}_p^T\pmb{w}))=0</script> ，而当该点被错误分类时，表达式为一个<strong>正数</strong>。通过简单地将所有对应的表达式相加，我们得到了代价函数：<br />
<script type="math/tex; mode=display">
g_1(b,\pmb{w})=\sum_{p=1}^P \max(0, -y_p(b+\pmb{x}_p^T\pmb{w})) \tag{4-5}
</script>
<br />
这被称为 <strong>感知机</strong>（因形状相似，也作合页） 或 <strong>最大值代价函数</strong> 。</p>
<p>求解以下最小化问题：<br />
<script type="math/tex; mode=display">
\min_{b,\pmb{w}}\sum_{p=1}^P \max(0, -y_p(b+\pmb{x}_p^T\pmb{w})) \tag{4-6}
</script>
<br />
继而确定分割超平面的最优参数。</p>
<blockquote class="content-quote">
<p>关于此最小化问题有两个显而易见的技术问题：</p>
<p>第一，对于 <script type="math/tex">g_1</script> 的平凡解 <script type="math/tex">b=0</script> 且 <script type="math/tex">\pmb{w}=\pmb{0}_{N \times 1}</script> 不满足分配需求，但是能保证 <script type="math/tex">g_1</script> 取到最小值 0。</p>
<p>第二，虽然 <script type="math/tex">g_1</script> 是连续的，但是它并不是处处可微的，因此不能用梯度下降法和牛顿法。针对这两个问题一个简单的解决方法是对感知机函数进行一个特定的平滑近似。</p>
<p><img class="pure-img" alt="g(s)func" src="https://zromyk.gitee.io/myblog-figurebed/post/机器学习精讲.assets/g(s)func.svg" /></p>
</blockquote>
<h4 id="textsoftmax">
<script type="math/tex">\text{softmax}</script> 代价函数</h4>
<p>
<script type="math/tex">\text{softmax}</script> 函数定义如下：<br />
<script type="math/tex; mode=display">
\text{soft}(s_1,s_2)=\ln(e^{s_1}+e^{s_2}) \tag{4-7}
</script>
<br />
<script type="math/tex">\max(s_1,s_2) \approx \text{soft}(s_1,s_2)</script>
</p>
<blockquote class="content-quote">
<p>更一般地，最大值函数的 <script type="math/tex">\text{softmax}</script> 近似可以应用于 <script type="math/tex">C</script> 个输入：</p>
<p>
<script type="math/tex; mode=display">
\max(s_1,\cdots,s_C)\approx \text{soft}(s_1,\cdots,s_C)=\ln(\sum_{c=1}^Ce^{sC})
</script>
</p>
</blockquote>
<p>
<script type="math/tex; mode=display">
\text{soft}(0, -y_p(b+\pmb{x}_p^T\pmb{w}))=\ln(1 + e^{-y_p(b+\pmb{x}_p^T\pmb{w})}) \tag{4-8}
</script>
</p>
<p>用它替代最大值函数，我们得到了感知机代价的一个平滑近似：<br />
<script type="math/tex; mode=display">
g_2(b,\pmb{w})=\sum_{p=1}^P \ln(1 + e^{-y_p(b+\pmb{x}_p^T\pmb{w})}) \tag{4-9}
</script>
<br />
此函数称为 <script type="math/tex">\text{softmax}</script> 代价函数。</p>
<h4 id="_20">间隔感知机</h4>
<p>
<script type="math/tex; mode=display">
b+\pmb{x}_p^T\pmb{w}\ge+1 \quad y_p = +1 \tag{4-14} \\
b+\pmb{x}_p^T\pmb{w}\le-1 \quad y_p = -1
</script>
</p>
<blockquote class="content-quote">
<p>将表达式整合成一个单独的表达式，即给他们乘上各自的标签：</p>
<p>
<script type="math/tex; mode=display">
y_p(b+\pmb{x}_p^T\pmb{w}) \ge +1 \\
1 - y_p(b+\pmb{x}_p^T\pmb{w}) \le 0
</script>
</p>
</blockquote>
<p>上面的表达式可以等价为：<br />
<script type="math/tex; mode=display">
\max(0, 1-y_p(b+\pmb{x}_p^T\pmb{w}))=0 \tag{4-15}
</script>
</p>
<p>将数据集中所有点按 <script type="math/tex">\text{(4-15)}</script>  相加，得到 <strong>间隔感知机</strong> 或 <strong>合页代价</strong>：<br />
<script type="math/tex; mode=display">
g_3(b,\pmb{w})=\sum_{p=1}^P \max(0, 1-y_p(b+\pmb{x}_p^T\pmb{w})) \tag{4-16}
</script>
</p>
<h4 id="_21">间隔感知机的可微近似</h4>
<p>
<script type="math/tex">\text{softmax}</script> 间隔感知机代价函数：<br />
<script type="math/tex; mode=display">
g_4(b,\pmb{w})=\sum_{p=1}^P \ln(1 + e^{1-y_p(b+\pmb{x}_p^T\pmb{w})}) \tag{4-17}
</script>
<br />
平方间隔感知机代价函数：<br />
<script type="math/tex; mode=display">
g_4(b,\pmb{w})=\sum_{p=1}^P \max^2(0, 1-y_p(b+\pmb{x}_p^T\pmb{w})) \tag{4-16}
</script>
</p>
<h4 id="_22">所学分类器的精度</h4>
<h4 id="_23">预测新输入数据的标签</h4>
<h4 id="_24">哪个代价函数会产生好的结果</h4>
<h4 id="_25">感知机和计数代价的关联</h4>
<h3 id="textsoftmax_1">逻辑回归视角下的 <script type="math/tex">\text{softmax}</script> 代价</h3>
<h4 id="_26">阶梯函数和分类</h4>
<p>二分类可以看作是 <strong>回归</strong> 或 <strong>曲面拟合</strong> 的一个特例。<br />
<script type="math/tex; mode=display">
sign(b+\pmb{x}_p^T\pmb{w})=+1 \qquad b+\pmb{x}_p^T\pmb{w} > 0,\quad y_p=+1 \tag{4-30} \\
sign(b+\pmb{x}_p^T\pmb{w})=-1 \qquad b+\pmb{x}_p^T\pmb{w} < 0,\quad y_p=-1
</script>
<br />
找到一组超参数 <script type="math/tex">(b,\pmb{w})</script> 使得标签 <script type="math/tex">y_p = +1</script> 的点位于阶梯函数的高阶，标签 <script type="math/tex">y_p = -1</script> 的点位于阶梯函数的低阶。选择正确的参数，将点 <script type="math/tex">\pmb{x}_p</script> 放置在正确的阶梯上意味着 <script type="math/tex">sign(b+\pmb{x}_p^T\pmb{w}) = y_p</script>，又因为 <script type="math/tex">y_p \in \{-1,+1\}</script> ，该式也可以写为：<br />
<script type="math/tex; mode=display">
sign(y_p(b+\pmb{x}_p^T\pmb{w}))=1 \tag{4-31}
</script>
</p>
<h4 id="_27">凸逻辑回归</h4>
<p>阶梯函数的一个良好平滑近似：<br />
<script type="math/tex; mode=display">
\sigma(x)=\cfrac{1}{1+e^{-x}} \tag{4-32}
</script>
<br />
拉伸该函数可以得到 <strong>“双曲正切”</strong> 函数：<br />
<script type="math/tex; mode=display">
\tanh^*(x)=2\sigma(2x)-1 \tag{4-33}
</script>
<br />
以下为 <script type="math/tex">\tanh(ax)</script> 的图像，通过增大 <script type="math/tex">a</script> 的值，可以得到阶梯函数的平滑近似：</p>
<p><img class="pure-img" alt="tanhax" src="https://zromyk.gitee.io/myblog-figurebed/post/机器学习精讲.assets/tanhax.svg" /></p>
<p>
<script type="math/tex; mode=display">
sign(y_p(b+\pmb{x}_p^T\pmb{w}))\approx1 \tag{4-35}
</script>
</p>
<p>我们可以给双曲正切函数的输入参数乘以一个大的正数，将 <script type="math/tex">tanh(x)</script> 作为 <script type="math/tex">sign(x)</script> 的平滑近似，得到</p>
<p>
<script type="math/tex; mode=display">
\tanh(y_p(b+\pmb{x}_p^T\pmb{w}))\approx1 \tag{4-36}
</script>
</p>
<p><img class="pure-img" alt="tanh_" src="https://zromyk.gitee.io/myblog-figurebed/post/机器学习精讲.assets/tanh_-4414314.svg" /></p>
<p>
<script type="math/tex">\tanh(x)</script> 和 <script type="math/tex">1+e^{-x}</script> 在 <script type="math/tex">x</script> 较大时近似相等，于是可将 <script type="math/tex">\text{(4-36)}</script> 近似为：<br />
<script type="math/tex; mode=display">
1+e^{-y_p(b+\pmb{x}_p^T\pmb{w})}\approx1 \tag{4-37}
</script>
<br />
两边取对数得到：<br />
<script type="math/tex; mode=display">
\ln(1+e^{-y_p(b+\pmb{x}_p^T\pmb{w})})\approx0 \tag{4-38}
</script>
<br />
得到代价函数：<br />
<script type="math/tex; mode=display">
g(b,\pmb{w})=\sum_{p=1}^P\ln(1+e^{-y_p(b+\pmb{x}_p^T\pmb{w})}) \tag{4-39}
</script>
</p>
<h3 id="_28">支持向量机视角下的间隔感知机</h3>
<h4 id="_29">寻找大间隔超平面</h4>
<h4 id="_30">硬间隔支持向量机问题</h4>
<h4 id="_31">软间隔支持向量机问题</h4>
<h4 id="_32">支持向量机和逻辑回归</h4>
<h3 id="_33">多分类</h3>
<h4 id="_34">一对多的多分类</h4>
<h4 id="softmax">多分类softmax分类</h4>
<h4 id="_35">所学多分类器的精度</h4>
<h4 id="_36">哪种多分类方法表现好</h4>
<h3 id="_37">面向分类的知识驱动特征设计</h3>
<h3 id="_38">面向真实数据类型的直方图特征</h3>
<h4 id="_39">文本数据的直方图特征</h4>
<h4 id="_40">图像数据的直方图特征</h4>
<h4 id="_41">音频数据的直方图特征</h4>
<h1 id="_42">第二部分 完全数据驱动的机器学习工具</h1>
<h2 id="5">第5章回归的自动特征设计</h2>
<h3 id="_43">理想回归场景中的自动特征设计</h3>
<h4 id="_44">向量逼近</h4>
<h4 id="_45">从向量到连续函数</h4>
<h4 id="_46">连续函数逼近</h4>
<h4 id="_47">连续函数逼近的常见基</h4>
<h4 id="_48">获取权重</h4>
<h4 id="_49">神经网络的图表示</h4>
<h3 id="_50">真实回归场景中的自动特征设计</h3>
<h4 id="_51">离散化的连续函数逼近</h4>
<h4 id="_52">真实回归场景</h4>
<h3 id="_53">回归交叉验证</h3>
<h4 id="_54">诊断过拟合与欠拟合问题</h4>
<h4 id="_55">留出交叉验证</h4>
<h4 id="_56">留出交叉验证的计算</h4>
<h4 id="k">k折交叉验证</h4>
<h3 id="_57">哪个基好</h3>
<h4 id="_58">理解数据背后的现象</h4>
<h4 id="_59">实践方面的考虑</h4>
<h4 id="_60">什么时候可任意选择基</h4>
<h4 id="_61">关于连续函数逼近的注释</h4>
<h2 id="6">第6章分类中的自动特征设计</h2>
<h3 id="_62">理想分类场景中的自动特征设计</h3>
<h4 id="_63">分段连续函数逼近</h4>
<h4 id="_64">指示函数的形式化定义</h4>
<h4 id="_65">指示函数逼近</h4>
<h4 id="_66">获取权重</h4>
<h3 id="_67">真实分类场景中的自动特征设计</h3>
<h4 id="_68">离散化的指示函数逼近</h4>
<h4 id="_69">真实的分类场景</h4>
<h4 id="_70">分类器精度和边界定义</h4>
<h3 id="_71">多分类</h3>
<h4 id="_72">一对多的多分类</h4>
<h4 id="softmax_1">多分类softmax分类</h4>
<h3 id="_73">分类交叉验证</h3>
<h4 id="_74">留出交叉验证</h4>
<h4 id="_75">留出交叉验证的计算</h4>
<h4 id="k_1">k折交叉验证</h4>
<h4 id="k_2">一对多多分类的k折交叉验证</h4>
<h3 id="_76">哪个基好</h3>
<h2 id="7">第7章核、反向传播和正则化交叉验证</h2>
<h3 id="_77">固定特征核</h3>
<h4 id="_78">线性代数基本定理</h4>
<h4 id="_79">核化代价函数</h4>
<h4 id="_80">核化的价值</h4>
<h4 id="_81">核的例子</h4>
<h4 id="_82">核作为相似矩阵</h4>
<h3 id="_83">反向传播算法</h3>
<h4 id="_84">计算两层网络代价函数的梯度</h4>
<h4 id="_85">计算三层神经网络的梯度</h4>
<h4 id="_86">动量梯度下降</h4>
<h3 id="l2">l2正则化交叉验证</h3>
<h4 id="l2_1">l2正则化和交叉验证</h4>
<h4 id="k_3">回归的k折正则化交叉验证</h4>
<h4 id="_87">分类的正则化交叉验证</h4>
<h3 id="_88">更多的核计算</h3>
<h4 id="_89">核化不同的代价函数</h4>
<h4 id="_90">傅里叶核——标量输入</h4>
<h4 id="_91">傅里叶核——向量输入</h4>
<h1 id="_92">第三部分大规模数据机器学习方法</h1>
<h2 id="8">第8章高级梯度算法</h2>
<h3 id="_93">梯度下降法的固定步长规则</h3>
<h4 id="_94">梯度下降法和简单的二次代理</h4>
<h4 id="_95">有界曲率函数和优保守步长规则</h4>
<h4 id="_96">如何使用保守固定步长规则</h4>
<h3 id="_97">梯度下降的自适应步长规则</h3>
<h4 id="_98">回溯线性搜索的自适应步长规则</h4>
<h4 id="_99">如何使用自适应步长规则</h4>
<h3 id="_100">随机梯度下降</h3>
<h4 id="_101">梯度分解</h4>
<h4 id="_102">随机梯度下降迭代</h4>
<h4 id="_103">随机梯度下降的价值</h4>
<h4 id="_104">随机梯度下降的步长规则</h4>
<h4 id="_105">在实践中如何使用随机梯度下降法</h4>
<h3 id="_106">梯度下降方案的收敛性证明</h3>
<h4 id="_107">利普希茨常数固定步长梯度下降的收敛性</h4>
<h4 id="_108">回溯线性搜索梯度下降的收敛性</h4>
<h4 id="_109">随机梯度法的收敛性</h4>
<h4 id="_110">面向凸函数的固定步长梯度下降的收敛速度</h4>
<h3 id="_111">计算利普希茨常数</h3>
<h2 id="9">第9章降维技术</h2>
<h3 id="_112">数据的降维技术</h3>
<h4 id="_113">随机子采样</h4>
<h4 id="k_4">K均值聚类</h4>
<h4 id="k_5">K均值问题的优化</h4>
<h3 id="_114">主成分分析</h3>
<h3 id="_115">推荐系统</h3>
<h4 id="_116">矩阵填充模型</h4>
<h4 id="_117">矩阵填充模型的优化</h4>
  </div>
</div>
 
    </div>
  </div>
  <div id="footer-background">
    <div id="footer">
      <div class="legal pure-g">
  <div class="pure-u-1 u-sm-1-2">
    <p class="legal-license"><a href="https://beian.miit.gov.cn/#/Integrated/index">浙ICP备2020038748号</a></p>
  </div>
  <div class="pure-u-1 u-sm-1-2">
    <p class="legal-links"><a href="https://github.com/zromyk">GitHub</a></p>
    <p class="legal-copyright">Copyright © 2021 Wei Zhou. 保留所有权利。</p>
  </div>
</div>
    </div>
  </div>
  <!-- <script src="https://cdn.bootcss.com/jquery/3.2.1/jquery.min.js"></script> -->
  <script src="/style/html/jquery.min.js"></script>
  <script src='/style/article/latex/latest.js?config=TeX-MML-AM_CHTML'></script>
<!-- <script src="https://cdn.geogebra.org/apps/deployggb.js"></script> -->
<script src="/style/article/deployggb.js"></script>
<!-- <script src="https://apps.bdimg.com/libs/highlight.js/9.1.0/highlight.min.js"></script> -->
<script type="text/javascript">
  // 脚本：navigation 随鼠标移动自动变换宽度
  var element = document.getElementById("navigation"); // 获取要操作的元素
  var elementWidth = parseInt(getComputedStyle(element).width);
  var elementLeft = 0;
  var elementRight = 0;
  element.addEventListener('mouseenter', function (event) { // 添加鼠标按下事件的监听器
    elementLeft = element.getBoundingClientRect().left - 10;
    elementRight = element.getBoundingClientRect().left + elementWidth * 3;
    window.addEventListener('mousemove', resize); // 添加全局的鼠标移动事件的监听器
  });

  function resize(event) {
    var minWidth = elementWidth;
    var maxWidth = elementWidth * 2.5;
    // console.log(elementLeft, event.clientX, elementRight, event.clientX - elementLeft + elementWidth / 2);
    if (elementLeft <= event.clientX && event.clientX <= elementRight) {
      var width = event.clientX - elementLeft + elementWidth / 2;
      width = Math.min(width, maxWidth);
      width = Math.max(width, minWidth);
      element.style.width = width + 'px'; // 设置新的宽度样式属性
    }
    else {
      element.style.width = elementWidth + 'px'; // 设置新的宽度样式属性
      stopResize();
    }
  }

  function stopResize() {
    element.style.width = elementWidth + 'px'; // 设置新的宽度样式属性
    // console.log("stopResize", elementLeft, event.clientX, elementRight, event.clientX - elementLeft + elementWidth / 2);
    window.removeEventListener('mousemove', resize); // 移除鼠标移动事件的监听器
  }
</script>
<script src="/style/article/highlight/highlight.min.js"></script>
<script type="text/javascript">
  // 脚本：code语法高亮
  hljs.initHighlightingOnLoad();
</script>
<script>
  function animateByNav() {
    $("html").animate({
        scrollTop: ($(event.target.hash).offset().top - 52)
    }, 300);
  };
</script>
<script src="/style/article/pell-1.0.6/dist/pell.js"></script>
<script>
  // 脚本：自由编辑页面
  var editor = window.pell.init({
    element: document.getElementById('editor'),
    defaultParagraphSeparator: 'p',
    onChange: function(html) {
        document.getElementById('text-output').innerHTML = html
        document.getElementById('html-output').textContent = html
    }
  });

  function markdownEditor() {
    var articles = document.getElementById('content-articles-markdown');
    if (articles.getAttribute("contenteditable") == "true") {
        articles.setAttribute("contenteditable", "false");
        document.getElementById("content-articles-markdownEditor").style.display = "none"; //隐藏
        document.getElementById("button-markdownEditor").innerHTML = "启用编辑";
    } else {
        articles.setAttribute("contenteditable", "true");
        document.getElementById("content-articles-markdownEditor").style.display = ""; //显示
        document.getElementById("button-markdownEditor").innerHTML = "关闭编辑";
    }
  };

  function save() {
      window.alert("保存成功");
  };
</script>

</body>
</html>
